1158. Telefraud Detection

Direct Link

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int G[1005][1005];

void search(int seed, vector<pair<int, bool>> &suspects, vector<int> &gang) {
    for (auto &s : suspects) {
        if (s.second || seed == s.first) continue;
        if (G[seed][s.first] > 0 && G[s.first][seed] > 0) {
            s.second = true;
            gang.push_back(s.first);
            search(s.first, suspects, gang);
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    fill(G[0], G[0] + 1005 * 1005, 0);
    int k, n, m, caller, receiver, duration;
    cin >> k >> n >> m;
    for (int i = 0; i < m; i++) {
        cin >> caller >> receiver >> duration;
        G[caller][receiver] += duration;
    }

    vector<pair<int, bool>> suspects;
    for (int i = 1; i <= n; i++) {
        int c1 = 0, c2 = 0;
        for (int j = 1; j <= n; j++) {
            if (i == j) continue;
            if (G[i][j] > 0 && G[i][j] <= 5) {
                c1++;
                if (G[j][i] > 0) c2++; 
            }
        }

        if (c1 > k && c2 * 5 <= c1) {
            suspects.push_back(make_pair(i, false));
        }
    }

    if (suspects.size() == 0) cout << "None" << endl;
    else {
        for (auto &s : suspects) {
            if (s.second) continue;

            vector<int> gang;
            s.second = true;
            gang.push_back(s.first);
            search(s.first, suspects, gang);
            sort(gang.begin(), gang.end());

            if (gang.size() > 0) {
                cout << gang[0];
                for (int i = 1; i < gang.size(); i++) cout << " " << gang[i];
                cout << endl;
            }
        }
    }

    return 0;
}